//////////////////////////////////////////////////////////////////////////////////
// information ///////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
/*
	
*/
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
// MESH STRUCTURE ////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#ifndef _SFRAME_H_
#define _SFRAME_H_

//////////////////////////////////////////////////////////////////////////////////
// INCLUDES / LIBS ///////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//#pragma comment ( lib, "d3dx8.lib"  )
//#pragma comment ( lib, "d3dxof.lib" )
//#pragma comment ( lib, "winmm.lib"  )

//#pragma comment ( lib, "dxguid.lib" )
//#pragma comment ( lib, "d3d8.lib"   )
//#pragma comment ( lib, "dxerr8.lib" )

#include <d3d8.h>
#include <math.h>
#include <D3DX8.h>

#define WIN32_LEAN_AND_MEAN
#include < windows.h >

#include "sMesh.h"
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
// DEFINES ///////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#define DARKSDK __declspec ( dllexport )
#define SAFE_DELETE( p )       { if ( p ) { delete ( p );       ( p ) = NULL; } }
#define SAFE_RELEASE( p )      { if ( p ) { ( p )->Release ( ); ( p ) = NULL; } }
#define SAFE_DELETE_ARRAY( p ) { if ( p ) { delete [ ] ( p );   ( p ) = NULL; } }
#define GXRELEASE(_p) do       { if ((_p) != NULL) {(_p)->Release(); (_p) = NULL;} } while (0)
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
// STRUCTURES ////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
struct sFrameMeshList
{
	// stores a list of meshes

	sMesh*			m_Mesh;		// mesh
	sFrameMeshList*	m_Next;		// next list

	// functions in structure

	sFrameMeshList  ( );		// constructor
	~sFrameMeshList ( );		// destructor
};

struct sLimb
{
	// limb data

	bool			bVisible;		// is limb visible

	D3DXVECTOR3		vecRotate;		// rotation points
	D3DXVECTOR3		vecOffset;		// offset points
	D3DXVECTOR3		vecScale;		// scale values

	D3DMATERIAL8	material;		// limb material - diffuse, alpha, ambient
};

struct sFrame
{
	// stores animation data

	char*			m_Name;				// frame name

	int				m_iID;

	bool			m_bFree;			// flagged when relinkable

	sFrameMeshList*	m_MeshList;			// list of meshes attached to this frame

	D3DXMATRIX		m_matCombined;		// combined transformation matrix
	D3DXMATRIX		m_matTransformed;	// currently transformed matrix
	D3DXMATRIX		m_matOriginal;		// original x file matrix

	sFrame*			m_Parent;			// parent frame
	sFrame*			m_Child;			// child frame
	sFrame*			m_Sibling;			// sibling frame

	sLimb			m_Limb;				// limb properties

	// functions in structure

	sFrame  ( );							// constructor
	~sFrame ( );							// destructor

	sFrame*	FindFrame     ( char* Name );	// finds a frame
	sFrame*	FindFrame     ( int iID );		// finds a frame
	void    ResetMatrices ( void );			// reset frame matrices
	void    AddMesh       ( sMesh* Mesh );	// adds a mesh to the list
};
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////

#endif _SFRAME_H_